home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr26 / netprog.zip / NETPROG.TAR / lib.s5 / spipe.c < prev    next >
C/C++ Source or Header  |  1989-12-17  |  1KB  |  56 lines

  1. /*
  2.  * Create an unnamed stream pipe.
  3.  */
  4.  
  5. #include    <sys/types.h>
  6. #include    <sys/stream.h>        /* defines queue_t */
  7. #include    <stropts.h>        /* defines struct strfdinsert */
  8. #include    <fcntl.h>
  9.  
  10. #define    SPX_DEVICE    "/dev/spx"
  11.  
  12. int                    /* return 0 if OK, -1 on error */
  13. s_pipe(fd)
  14. int    fd[2];        /* two file descriptors returned through here */
  15. {
  16.     struct strfdinsert    ins;
  17.     queue_t            *pointer;
  18.  
  19.     /*
  20.      * First open the stream clone device "/dev/spx" twice,
  21.      * obtaining the two file descriptors.
  22.      */
  23.  
  24.     if ( (fd[0] = open(SPX_DEVICE, O_RDWR)) < 0)
  25.         return(-1);
  26.  
  27.     if ( (fd[1] = open(SPX_DEVICE, O_RDWR)) < 0) {
  28.         close(fd[0]);
  29.         return(-1);
  30.     }
  31.  
  32.     /*
  33.      * Now link these two streams together with an I_FDINSERT ioctl.
  34.      */
  35.  
  36.     ins.ctlbuf.buf     = (char *) &pointer;    /* no ctl info, just the ptr */
  37.     ins.ctlbuf.maxlen  = sizeof(queue_t *);
  38.     ins.ctlbuf.len     = sizeof(queue_t *);
  39.  
  40.     ins.databuf.buf    = (char *) 0;    /* no data to send */
  41.     ins.databuf.len    = -1; /* magic: must be -1, not 0, for stream pipe */
  42.     ins.databuf.maxlen = 0;
  43.  
  44.     ins.fildes = fd[1];    /* the fd to connect with fd[0] */
  45.     ins.flags  = 0;        /* nonpriority message */
  46.     ins.offset = 0;        /* offset of pointer in control buffer */
  47.  
  48.     if (ioctl(fd[0], I_FDINSERT, (char * ) &ins) < 0) {
  49.         close(fd[0]);
  50.         close(fd[1]);
  51.         return(-1);
  52.     }
  53.  
  54.     return(0);        /* all OK */
  55. }
  56.